#define  _CRT_SECURE_NO_WARNINGS 1

//#include<bits/stdc++.h>
//#define sd(n) scanf("%d",&n) 
//#define sld(n) scanf("%lld",&n)
//#define pd(n) printf("%d", (n))
//#define pld(n) printf("%lld", n)
//#define all(x) (x).begin(),(x).end()
//#define rall(x) (x).rbegin(),(x).rend()
//#define fi first
//#define se second
//const int N = 2e5;
//const int maxn = 1e6;
//typedef long long int ll;
//using namespace std;
////----------------------------------------------------------------------------//
//
//void solve()
//{
//	string s;
//	char c;
//	cin >> s >> c;
//	int pos[110];
//	int pos2 = 0;
//	for (int i = 0; i < s.size(); i++)
//	{
//		if (s[i] == c)
//		{
//			pos[pos2] = (i + 1);
//			pos2++;
//		}
//	}
//	int flag = 0;
//	for (int i = 0; i < pos2; i++)
//	{
//		if ((pos[i] - 1) % 2 != 0)
//		{
//			continue;
//		}
//		if ((s.size() - pos[i]) != 0 && (s.size() - pos[i]) % 2 != 0)
//		{
//			continue;
//		}
//		flag = 1;
//		cout << "YES" << '\n';
//		return;
//
//	}
//	if (flag != 1)
//	{
//		cout << "NO" << '\n';
//		return;
//	}
//
//}
//
//int main()
//{
//	int T;
//	sd(T);
//	while (T--)
//	{
//		solve();
//	}
//	return 0;
//}



//#include<bits/stdc++.h>
//#define sd(n) scanf("%d",&n) 
//#define sld(n) scanf("%lld",&n)
//#define pd(n) printf("%d", (n))
//#define pld(n) printf("%lld", n)
//#define all(x) (x).begin(),(x).end()
//#define rall(x) (x).rbegin(),(x).rend()
//#define fi first
//#define se second
//const int N = 2e5;
//const int maxn = 1e6;
//typedef long long int ll;
//using namespace std;
////----------------------------------------------------------------------------//
//
//void solve()
//{
//	int r, l, a;
//	sd(l); sd(r); sd(a);
//	int ans = 0;
//	for (int i = l; i <= r;i++)
//	{
//		int cur = (i / a) + (i % a);
//		ans = max(ans, cur);
//	}
//	cout << ans;
//	puts("");
//}
//
//int main()
//{
//	int T;
//	sd(T);
//	while (T--)
//	{
//		solve();
//	}
//	return 0;
//}










#include<bits/stdc++.h>
#define sd(n) scanf("%d",&n) 
#define sld(n) scanf("%lld",&n)
#define pd(n) printf("%d", (n))
#define pld(n) printf("%lld", n)
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define fi first
#define se second
const int N = 2e5;
const int maxn = 1e6;
typedef long long int ll;
using namespace std;
//----------------------------------------------------------------------------//

pair<int, pair<int, int>> node[N + 10];
int pos_node[N + 10];
int pos;
int val;

void solve()
{
	int n, m;
	sd(n); sd(m);
	for (int i = 0; i <m; i++)
	{
		sd(pos); sd(val);
		node[i].fi = val;
		node[i].se.fi = pos;
		node[i].se.se = i + 1;
	}
	sort(node, node + m);
	ll sum = 0;
	for (int i = 0; i < n * 2; i++)
	{
		sum += node[i].fi;
		pos_node[i] = node[i].se.se;
	}
	sort(pos_node, pos_node + 2 * n);

	cout << sum << '\n';
	for (int i = 0, j = n * 2 - 1; i < j; i++, j--)
	{
		cout << pos_node[i] << " " << pos_node[j];
		puts("");
	}
	puts("");

}

int main()
{
	int T;
	sd(T);
	while (T--)
	{
		solve();
	}
	return 0;
}